package Controleur;

import java.text.DateFormat;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.http.*;

import Helpers.Configuration;
import Helpers.Helpers;
import JavaBean.BeanBillet;
import Modele.*;

public class PanierServlet extends CustomServlet
{
	private static final long serialVersionUID = 1L;

	@Override
	public void executeGet(HttpServletRequest request, HttpServletResponse response )
	{
		Panier panier = Helpers.getPanier(request.getSession());
		ListeRepresentations rep = (ListeRepresentations)getServletContext().getAttribute("listeRepresentations");
		
		int nbBilletsPanier = panier.getNbBillets();
		
		if ( request.getParameter("idRepresentation") != null && request.getParameter("nbBillets") != null )
		{
			try
			{
				int idRepresentation = Integer.parseInt(request.getParameter("idRepresentation"));
				int nbBillets = Integer.parseInt(request.getParameter("nbBillets"));
				
				if ( nbBilletsPanier + nbBillets <= Configuration.MAX_BILLETS )
				{
					for ( int i = 0 ; i < nbBillets ; i++ )
						panier.ajouterbillet(rep.getRepresentation( idRepresentation ).reserverBillet());
				}
				else
					request.setAttribute( "messageErreur" , "Vous ne pouvez pas réserver plus de 6 billets à la fois." );				
			}
			catch ( Exception e )
			{
				request.setAttribute( "messageErreur" , "Il a été impossible d'ajouter tous les billets que vous désiriez puisqu'il n'y en a plus assez de disponibles." );				
			}		
		}
			    
		request.setAttribute("billets", getListeBillets ( panier ));			
	}
	
	public void executePost(HttpServletRequest request, HttpServletResponse response) 
	{
			Panier panier = Helpers.getPanier(request.getSession());

			HashMap<Representation,ArrayList<Billet>> mapBillets = new HashMap<Representation,ArrayList<Billet>> ();	
			int nbBilletsDesires = 0;
			
			for( Billet b : panier.getBillets() )
				if ( mapBillets.containsKey( b.getRepresentation() ) )
					mapBillets.get( b.getRepresentation() ).add( b );
				else
				{
					ArrayList<Billet> billets = new ArrayList<Billet>();
					billets.add( b );
					mapBillets.put(b.getRepresentation(), billets );
				}
			
			for ( Representation representation : mapBillets.keySet() )
			{			
				try
				{
					String param = "quantite_" + representation.getId();
					int nb = Integer.parseInt(request.getParameter(param));
					nbBilletsDesires += nb;
				}
				catch ( Exception e )
				{
					nbBilletsDesires += mapBillets.get(representation).size();
				}
	
			}
			
			if ( nbBilletsDesires <= Configuration.MAX_BILLETS )
			{
				for ( Representation representation : mapBillets.keySet() )
				{
					try
					{
						ArrayList<Billet> billets = mapBillets.get(representation);
						String param = "quantite_" + representation.getId();
						if ( request.getParameter(param) != null)
						{
							int nb = Integer.parseInt(request.getParameter(param));
							
							if ( nb < billets.size() )
							{					
								for ( int i = 0; i < billets.size ( ) - nb; i ++ )
									billets.get(i).liberer ( );
									
							}
							else if ( nb > billets.size ( ) )
							{						
								for ( int i = 0; i < nb - billets.size ( ); i ++ )
									panier.ajouterbillet(representation.reserverBillet());
							}				
						}	
					}
					catch ( Exception e )
					{
						request.setAttribute( "messageErreur" , "Il a été impossible d'ajouter tous les billets que vous désiriez puisqu'il n'y en a plus assez de disponibles." );				
					}
				}
			}
			else
			{
				request.setAttribute( "messageErreur" , "Vous ne pouvez pas réserver plus de 6 billets à la fois." );				
			}
			
			executeGet(request, response);
	}
	
	private Collection<BeanBillet> getListeBillets ( Panier p )
	{
		HashMap<Representation, BeanBillet> mapBillets = new HashMap<Representation, BeanBillet> ( );
		DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.CANADA_FRENCH);		
		
		for( Billet b : p.getBillets() )
		{
			BeanBillet beanBillet;
			if ( ! b.estDisponible() )
				if ( mapBillets.containsKey(b.getRepresentation()))
				{
					beanBillet = mapBillets.get(b.getRepresentation());
					beanBillet.setQuantite(beanBillet.getQuantite()+1);
				}
				else
				{
					beanBillet = new BeanBillet();
					beanBillet.setTitre(b.getRepresentation().getTitre());
					beanBillet.setQuantite(1);
					beanBillet.setPrixUnitaire(b.getRepresentation().getCout());
					beanBillet.setIdRepresentation(b.getRepresentation().getId());
					beanBillet.setEmplacement(b.getRepresentation().getEmplacement().getNom());
					beanBillet.setDateRepresentation(df.format(b.getRepresentation().getDate().getTime()));
					mapBillets.put(b.getRepresentation(), beanBillet);
				}
		}
		
		for ( BeanBillet beanBillet : mapBillets.values ( ) )
			beanBillet.setPrixTotal(beanBillet.getPrixUnitaire()*beanBillet.getQuantite());
		
		return trierBillets(mapBillets.values());
	}
	
	private Collection<BeanBillet> trierBillets ( Collection<BeanBillet> billets )
	{
		ArrayList<BeanBillet> billets2 = new ArrayList<BeanBillet> (billets);
		
		Collections.sort(billets2, new BilletComparator());
		
		return billets2;
	}
	
	class BilletComparator implements Comparator<BeanBillet>
	{
		  public int compare(BeanBillet b1, BeanBillet b2)
		  {	    
		    return b1.getTitre().compareToIgnoreCase(b2.getTitre());
		  }
	}
}
